import ACrypto from "@/utils/crypto";
import { SYS_CONFIG } from "@/stores/mutation-types";
/**
 * @名字: 简单数据类型转换成树形结构
 * @详情:
 * @参数: list: 传入数组 id:子级id pId:父级id
 * @返回值:
 */
// 转换树行数据的方法
export function transTree(list: any[], id: string, pId: string) {
  // 最终生成的树行结构
  const treeData: any[] = [];

  // 对传入进来的 数据进行遍历，查找对应的子级
  list.forEach(item => {
    // 给每一项添加子节点
    // item.children = []

    // 如果 pid 为空，说明是最顶级，直接放到 treeData 中即可
    if (!item[pId]) {
      treeData.push(item);
    }

    // 根据前面的分析，pid 代表的是父级的 id，从而可以进行筛选子级
    // filter 方法会把满足条件到的每一项，组成一个数组进行返回
    const children = list.filter(data => data[pId] === item[id]);

    // 如果没有子节点，直接 return 不做任何处理
    if (!children.length) return;

    // 将返回的子级进行赋值给父级(item)的 children 属性
    item.children = children;
  });

  // 将最终生成的数据返回出去
  return treeData;
}
// 二进制数组转base64
export const arrayToBase64 = (bytes: any) => {
  let bString = "";
  for (let i = 0, len = bytes.length; i < len; ++i) {
    bString += String.fromCharCode(bytes[i]);
  }
  return btoa(bString);
};
/**
 * @描述: base64转二进制数组
 * @参数: base64 代表base64格式, callback代表回调函数
 * @返回值: 转换后的数据结果
 */
export const base64ToBlob = (base64: any, callback: any) => {
  let arr = base64.split(",");
  let bstr = atob(arr[1]);
  let n = bstr.length;
  let u8arr = [];
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  callback(u8arr);
};
// base64转byteArrays
export const base64ToBuffer = (b64data = "") => {
  const sliceSize = 512;
  // 使用 atob() 方法将数据解码
  const byteCharacters = atob(b64data);
  const byteArrays = [];
  for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
    const slice = byteCharacters.slice(offset, offset + sliceSize);
    const byteNumbers = [];
    for (let i = 0; i < slice.length; i++) {
      byteNumbers.push(slice.charCodeAt(i));
    }
    // 8 位无符号整数值的类型化数组。内容将初始化为 0。
    // 如果无法分配请求数目的字节，则将引发异常。
    byteArrays.push(new Uint8Array(byteNumbers));
  }
  const result = new Blob(byteArrays, {
    type: "application/vnd.ms-excel"
  });
  return result;
};
/**
 * @描述: 将文件转换成base64格式
 * @参数: file代表文件 callback代表回调函数
 * @返回值: 转换后的结果(base64)
 */
export const fileToBase64 = (file: any, callback: any) => {
  let reader = new FileReader();
  // 传入一个参数对象即可得到基于该参数对象的文本内容
  reader.readAsDataURL(file);
  reader.onload = function (e: any) {
    // target.result 该属性表示目标对象的DataURL
    callback(e.target.result);
  };
};
export const isBase64 = (str: any) => {
  if (str === "" || str === null) {
    return false;
  }
  try {
    return btoa(atob(str)) === str;
  } catch (err) {
    return false;
  }
};
/**
 * @名字: 系统参数
 * @详情: 从系统参数表中拿需要的数据
 * @参数: name 代表键名
 * @返回值: 返回该键值
 */
export const getSysConfig = (name: string) => {
  const sysConfig = ACrypto.getSS(window.sessionStorage.getItem(SYS_CONFIG) as string, SYS_CONFIG);
  const result = sysConfig.find((v: any) => v.Sys_Key === name);
  if (result) {
    return result.Sys_Value;
  }
};
